package com.divemotor.ventarepuestosinternet.dao.impl;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.divemotor.ventarepuestosinternet.beans.adapter.DataAdapter;
import com.divemotor.ventarepuestosinternet.dao.SucursalDAO;
import com.divemotor.ventarepuestosinternet.model.Sucursal;
import com.divemotor.ventarepuestosinternet.model.Supervisor;
import com.divemotor.ventarepuestosinternet.model.Vendedor;
import com.divemotor.ventarepuestosinternet.util.Constantes;
import com.divemotor.ventarepuestosinternet.util.DatosDeSession;

@SuppressWarnings("unchecked")
@Repository(value="sucursalDAO")
public class SucursalDAOImpl extends GenericoDAOImpl<Sucursal, Integer> implements SucursalDAO, Serializable{

	private static final long serialVersionUID = 6404516768551278109L;
	
	@Autowired
	private SessionFactory sessionFactory;
	
	public SucursalDAOImpl(){
		setClase(Sucursal.class);
	}

	@Override
	public List<DataAdapter> listarSucursalesPorProvincia(Integer idProvincia) {
		Query q = sessionFactory.getCurrentSession().getNamedQuery("Sucursal.porProvinciaAdapter")
								.setParameter("idProvincia", idProvincia)
								.setParameter("esVentaRepuestos", Constantes.INDICADOR_AFIRMATIVO)
								.setParameter("estado", Constantes.ESTADO_ACTIVO);
		return q.list();
	}

	@Override
	public List<Sucursal> listarSucursalesDeSupervisorAutenticado() {
		Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Supervisor.class)
				.add(Restrictions.eq("usuario", DatosDeSession.obtenerUsuarioAutenticado()))
				.add(Restrictions.not(Restrictions.eq("estado", Constantes.ESTADO_ELIMINADO)));
		
		Supervisor supervisor = (Supervisor) criteria.uniqueResult();
		
		if (supervisor != null && supervisor.getListaSucursal() != null) {
			return supervisor.getListaSucursal();
		} else {
			return new ArrayList<Sucursal>();
		}
	}

	@Override
	public Sucursal obtenerSucursalDeVendedorAutenticado() {
		Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Vendedor.class)
				.add(Restrictions.eq("usuario", DatosDeSession.obtenerUsuarioAutenticado()))
				.add(Restrictions.not(Restrictions.eq("estado", Constantes.ESTADO_ELIMINADO)));
		
		Vendedor vendedor = (Vendedor) criteria.uniqueResult();
		
		if (vendedor != null && vendedor.getSucursal() != null) {
			return vendedor.getSucursal();
		} else {
			return new Sucursal();
		}
	}

	@Override
	public List<DataAdapter> listarSucursalesAdapter() {
		Query q = sessionFactory.getCurrentSession().getNamedQuery("Sucursal.dataAdapter")
										  .setParameter("pais", DatosDeSession.obtenerPaisDelUsuarioAutenticado())
										  .setParameter("esVentaRepuestos", Constantes.INDICADOR_AFIRMATIVO)
										  .setParameter("estado", Constantes.ESTADO_ACTIVO);
		return q.list();
	}
	
	@Override
	public List<Sucursal> listarActivos() {
		Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Sucursal.class)
										  .add(Restrictions.eq("pais", DatosDeSession.obtenerPaisDelUsuarioAutenticado()))
										  .add(Restrictions.eq("esVentaRepuestos", Constantes.INDICADOR_AFIRMATIVO))
										  .add(Restrictions.eq("estado", Constantes.ESTADO_ACTIVO));
		return criteria.list();
	}
	
}
